import axios from 'axios'
// import type { AxiosRequestConfig } from 'axios'
import { ElMessage, ElLoading } from 'element-plus'
import router from '@/router/index'
import { useUserInfoStoreWithOut } from '@/store/modules/userInfo'

const userInfoStore = useUserInfoStoreWithOut()
const service = axios.create({
  timeout: 60000, // 60s
  baseURL: import.meta.env.VITE_BASE
})

let loading: any
let requestNum: number = 0 // 请求次数

// 请求拦截器
service.interceptors.request.use((config: any) => {
  // 此处添加loading、设置 token 等
  const user = userInfoStore.user
  console.log(user?.token)
  // if (user && user.token) {
  //   config.headers.Authorization = user.token
  // }
  if (requestNum === 0) {
    loading = ElLoading.service({ fullscreen: true, text: '正在加载中' })
  }
  requestNum++
  return config
}, (error: any) => {
  closeLoading()
  ElMessage.error('请求错误，请稍后重试！')
  return Promise.reject(error)
})

// 响应拦截器
service.interceptors.response.use((response: any) => {
  closeLoading()
  // 第一层为浏览器响应层：config、data、headers、request、status、statusText
  if (response.status === 200) {
    const status = response.data.status | response.data.code
    const { data, msg } = response.data // 后台封装的返回的数据结构
    /**
     * status: 200,表示正确的情况（尽量不要使用0，因为返回流内容时，status是不存在的，故'!status'这个判断不够严谨）
     * 错误的情况：
     *  1.token无效，清除本地过期的登录状态，跳转到登录页面，抛出异常
     *  2.下载文件失败时，返回json格式内容
     *  3.无权限时，重定向到登录页
     */
    if (!status || status === 200) { // 200为响应成功状态码,status不存在的情况是返回的内容为二进制流文件
      return data
    } else if (status === 401 || status === 403) {
      ElMessage.error('您的登录已过期或者你还没有登录，请确认后重试！')
      userInfoStore.setUser(null) // 清除过期的登录状态
      router.push({ name: 'Login', query: { redirect: router.currentRoute.value.fullPath } }) // 跳转到登录页，登录成功后，回到当前页
      return Promise.reject(response.data)
    } else {
      ElMessage.error(msg || '服务器错误，请稍后重试！') // 其他错误，暂不做处理，统一返回
      return Promise.reject(response.data)
    }
  } else {
    return Promise.reject(response)
  }
}, (error: any) => {
  closeLoading()
  let errorMessage = error
  if (error.message.includes('timeout')) {
    errorMessage = '请求超时，请稍后重试！'
  } else if (error.message.includes('Network Error')) {
    errorMessage = '网络连接失败，请稍后重试！'
  } else {
    errorMessage = '请求失败，请稍后重试！'
  }
  ElMessage.error(errorMessage)
  return Promise.reject(error)
})

export default service

// 对request进行处理
// export default <T = any>(config: AxiosRequestConfig) => {
//   return service(config).then((res: { data: T }) => {
//     return res.data as T
//   })
// }

// 关闭loading
function closeLoading () {
  requestNum--
  if (requestNum === 0) {
    loading.close()
  }
}
